import { markRaw } from 'vue'
import type { Component } from 'vue' // 导入Component类型
//import { House, Avatar, Document, Tickets, Setting, Clock, Lock } from '@element-plus/icons-vue'
import {
  House,
  Avatar,
  Document,
  Tickets,
  HomeFilled,
  User,
  Ticket,
  Setting,
  Clock,
  Lock,
  Menu,         // 菜单图标
  Search,       // 搜索图标
  Bell,         // 通知铃铛
  Message,      // 消息图标
  Plus,         // 加号
  Minus,        // 减号
  Edit,         // 编辑
  Delete,       // 删除
  Check,        // 勾选
  Close,        // 关闭
  Refresh,      // 刷新
  Download,     // 下载
  Upload,       // 上传
  Filter,       // 筛选
  More,         // 更多
} from '@element-plus/icons-vue'
/**
 * 根据图标名称获取对应的组件
 * @param iconName 图标名称
 * @returns 图标组件或undefined
 */
export function getIconComponent(iconName?: string): Component | undefined {
  if (!iconName) {
    return undefined
  }

  // 映射图标名称到对应的Element Plus图标组件
  const iconMap: Record<string, Component> = {
    House,        // 首页
    Avatar,       // 头像
    Document,     // 文档
    Tickets,      // 票据
    Setting,      // 设置
    HomeFilled,   // 填充首页
    User,         // 用户
    Ticket,       // 票
    Clock,        // 时钟
    Lock,         // 锁
    Menu,         // 菜单图标
    Search,       // 搜索图标
    Bell,         // 通知铃铛
    Message,      // 消息图标
    Plus,         // 加号
    Minus,        // 减号
    Edit,         // 编辑
    Delete,       // 删除
    Check,        // 勾选
    Close,        // 关闭
    Refresh,      // 刷新
    Download,     // 下载
    Upload,       // 上传
    Filter,       // 筛选
    More,         // 更多
  }

  // 使用markRaw确保图标组件不是响应式的
  const iconComponent = iconMap[iconName]
  if (iconComponent) {
    return markRaw(iconComponent)
  }
  // 如果图标不存在，返回undefined而不是尝试对undefined调用markRaw
  return undefined
}

/**
 * 递归处理菜单树，为所有图标应用markRaw
 * @param items 菜单项数组
 * @returns 处理后的菜单项数组
 */
export function processMenuItems(items: any[]) {
  return items.map(item => {
    // 为当前菜单项的图标应用markRaw
    const processedItem = {
      ...item,
      icon: item.icon ? markRaw(item.icon) : undefined
    }

    // 递归处理子菜单
    if (item.children && Array.isArray(item.children)) {
      processedItem.children = processMenuItems(item.children)
    }

    return processedItem
  })
}